package com.cjjs.jsf.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.cjjs.jsf.entity.SpelAndOpenId;
import com.cjjs.jsf.entity.Spelling;
import com.cjjs.jsf.exception.Myexception;
import com.cjjs.jsf.repository.SpelAndOpenIdRepository;
import com.cjjs.jsf.repository.SpellingRepository;
import com.cjjs.jsf.service.WXSpellingService;
import com.cjjs.jsf.util.DateUtil;
import com.cjjs.jsf.util.IsNotNullValit;

@Service
public class WXSpellingServiceImpl implements WXSpellingService {
	
	@Value("${wxapp.ptpayTime}")
	private int payTime;
	
	@Autowired
	private SpellingRepository spellingRepository;
	
	@Autowired
	private SpelAndOpenIdRepository spelAndOpenIdRepository;

	@Override
	public void saveOrUpdate(String openId, String spelId) {
		
		synchronized (this) {
			
			Optional<Spelling> spelling = this.spellingRepository.findById(spelId);
			
			if (spelling.isPresent()) {
				
				Spelling spel = spelling.get();
				
				List<SpelAndOpenId> spelAndOpens = this.spelAndOpenIdRepository.findBySpelid(spelId);
				List<String> spelAndOpensId = new ArrayList<String>(20);
				//如果没有最大数量，或者最大数量为0或者已经拼完了
				if(spel.getMaxSpelNum()==0 || spel.getMaxSpelNum()==null || spel.getCurrentSpelNum() > spel.getMaxSpelNum()) {
					throw new Myexception("该团还未开启");
				}else {
					
					if(spel.getCurrentSpelNum() == spel.getMaxSpelNum()){
						
						boolean isEnough = false;
						
						//当前团满，但是有用户超过3个小时没有支付，则直接剔除没有支付的用户
						for (int i=0;i<spelAndOpens.size();i++) {
							SpelAndOpenId saoid = spelAndOpens.get(i);
							spelAndOpensId.add(saoid.getId());
							if(saoid.getStatus()==-1 && DateUtil.xcHours(saoid.getCreateDate(), new Date())>=payTime) {
								spelAndOpens.remove(i);
								isEnough = true;
							}
						}
						
						//图满而且还有用户在限定时间没有支付，则不能够再添加新成员
						if(!isEnough) {
							throw new Myexception("该团已满");
						}
						
					}
					
					Integer curentNum = spel.getCurrentSpelNum();
					spel.setCurrentSpelNum(curentNum+1);
					
					if(IsNotNullValit.CollectionIsNotNull(spelAndOpens)) {
						//先删除
						for(String id: spelAndOpensId)
							this.spelAndOpenIdRepository.deleteById(id);
					}
					
					SpelAndOpenId sao = new SpelAndOpenId();
					sao.setOpenId(openId);
					sao.setSpelid(spelId);
					sao.setCreateDate(new Date());
					sao.setStatus(-1);
					
					spelAndOpens.add(sao);
					
					//再添加
					this.spelAndOpenIdRepository.saveAll(spelAndOpens);
					
				} 
				
			}else {
				throw new Myexception("竟然没有拼团信息");
			}
		}
		
	}

	@Override
	public boolean valitSpell(String spelId, String openId) {

		List<SpelAndOpenId> saos = this.spelAndOpenIdRepository.findBySpelidAndOpenId(spelId,openId);
		
		//如果出现两条数据就报错，让管理员去后台清理数据
		if(IsNotNullValit.CollectionIsNotNull(saos) && saos.size()>1) {
			throw new Myexception("出现多条数据，请联系管理员查看并清理!拼团ID："+spelId);
		}
		
		//如果存在数据就返回true，以防客户重复拼团
		if (IsNotNullValit.CollectionIsNotNull(saos) && saos.size()==1) {
			
			SpelAndOpenId asoi = saos.get(0);
			
			//已经超过payTime，则重新预约
			if(DateUtil.xcHours(asoi.getCreateDate(), new Date())>payTime) {
				return false;
			}
			
			return true;
		}
		
		return false;
	}

}
